home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Your Choice 3
/
Your Choice Software Collection 3.iso
/
prgmming
/
flames
/
flame_ac.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-29
|
10KB
|
257 lines
//**************************************************************************
//* *
//* CFLAMES1 by Kirk A. Baum *
//* This C program was addapted from a pascal program by M.D.Mackey. *
//* It has been modified to half the resolution used by Mark and the *
//* routines are entirely in C. The original code was written in *
//* Pascal with Inline assemby. As with Marks code, I release this *
//* code into the public domain. It may be freely distributed and *
//* modified, but please give credit where it is due if used. *
//* If you have any suggestions or comments please contact me at: *
//* kbaum@Novell.com. *
//* Mark can be reached at: mackey@aqueous.ml.csiro.au *
//* *
//**************************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <dos.h>
#define VIDEO_INT 0x10
#define VGA_MODE 0x13
#define TEXT_MODE 0x03
#define V_WIDTH 80
#define V_HEIGHT 50
#define BUF_WIDTH 80
#define BUF_HEIGHT 56
#define PALETTE_SIZE 256*3
#define INT_SIZE 2
#define ESC_KEY 27
#define VGA_SCREEN 0xa000
#define DAC_WRITE_INDEX 0x03c8
#define DAC_DATA_REG 0x03c9
void SetVGAMode13(void);
void RestoreTextMode(void);
void SetPalette(void);
unsigned char far *screen; // pointer to the VGA graphics screen 320x200
int p1[BUF_HEIGHT][BUF_WIDTH];// VGA buffer, quarter resolution w/extra lines
unsigned int i,j,k,l,delta; // looping variables, counters, and data
char ch; // input character
// VGA color palette for flames
unsigned char pal[PALETTE_SIZE]={ 0, 0, 0, 0, 0, 24, 0, 0, 24, 0, 0, 28,
0, 0, 32, 0, 0, 32, 0, 0, 36, 0, 0, 40,
8, 0, 40, 16, 0, 36, 24, 0, 36, 32, 0, 32,
40, 0, 28, 48, 0, 28, 56, 0, 24, 64, 0, 20,
72, 0, 20, 80, 0, 16, 88, 0, 16, 96, 0, 12,
104, 0, 8,112, 0, 8,120, 0, 4,128, 0, 0,
128, 0, 0,132, 0, 0,136, 0, 0,140, 0, 0,
144, 0, 0,144, 0, 0,148, 0, 0,152, 0, 0,
156, 0, 0,160, 0, 0,160, 0, 0,164, 0, 0,
168, 0, 0,172, 0, 0,176, 0, 0,180, 0, 0,
184, 4, 0,188, 4, 0,192, 8, 0,196, 8, 0,
200, 12, 0,204, 12, 0,208, 16, 0,212, 16, 0,
216, 20, 0,220, 20, 0,224, 24, 0,228, 24, 0,
232, 28, 0,236, 28, 0,240, 32, 0,244, 32, 0,
252, 36, 0,252, 36, 0,252, 40, 0,252, 40, 0,
252, 44, 0,252, 44, 0,252, 48, 0,252, 48, 0,
252, 52, 0,252, 52, 0,252, 56, 0,252, 56, 0,
252, 60, 0,252, 60, 0,252, 64, 0,252, 64, 0,
252, 68, 0,252, 68, 0,252, 72, 0,252, 72, 0,
252, 76, 0,252, 76, 0,252, 80, 0,252, 80, 0,
252, 84, 0,252, 84, 0,252, 88, 0,252, 88, 0,
252, 92, 0,252, 96, 0,252, 96, 0,252,100, 0,
252,100, 0,252,104, 0,252,104, 0,252,108, 0,
252,108, 0,252,112, 0,252,112, 0,252,116, 0,
252,116, 0,252,120, 0,252,120, 0,252,124, 0,
252,124, 0,252,128, 0,252,128, 0,252,132, 0,
252,132, 0,252,136, 0,252, 136, 0,252, 140, 0,
252, 140, 0,252, 144, 0,252, 144, 0,252, 148, 0,
252, 152, 0,252, 152, 0,252, 156, 0,252, 156, 0,
252, 160, 0,252, 160, 0,252, 164, 0,252, 164, 0,
252, 168, 0,252, 168, 0,252, 172, 0,252, 172, 0,
252, 176, 0,252, 176, 0,252, 180, 0,252, 180, 0,
252, 184, 0,252, 184, 0,252, 188, 0,252, 188, 0,
252, 192, 0,252, 192, 0,252, 196, 0,252, 196, 0,
252, 200, 0,252, 200, 0,252, 204, 0,252, 208, 0,
252, 208, 0,252, 208, 0,252, 208, 0,252, 208, 0,
252, 212, 0,252, 212, 0,252, 212, 0,252, 212, 0,
252, 216, 0,252, 216, 0,252, 216, 0,252, 216, 0,
252, 216, 0,252, 220, 0,252, 220, 0,252, 220, 0,
252, 220, 0,252, 224, 0,252, 224, 0,252, 224, 0,
252, 224, 0,252, 228, 0,252, 228, 0,252, 228, 0,
252, 228, 0,252, 228, 0,252, 232, 0,252, 232, 0,
252, 232, 0,252, 232, 0,252, 236, 0,252, 236, 0,
252, 236, 0,252, 236, 0,252, 240, 0,252, 240, 0,
252, 240, 0,252, 240, 0,252, 240, 0,252, 244, 0,
252, 244, 0,252, 244, 0,252, 244, 0,252, 248, 0,
252, 248, 0,252, 248, 0,252, 248, 0,252, 252, 0,
252, 252, 4,252, 252, 8,252, 252, 12,252, 252, 16,
252, 252, 20,252, 252, 24,252, 252, 28,252, 252, 32,
252, 252, 36,252, 252, 40,252, 252, 40,252, 252, 44,
252, 252, 48,252, 252, 52,252, 252, 56,252, 252, 60,
252, 252, 64,252, 252, 68,252, 252, 72,252, 252, 76,
252, 252, 80,252, 252, 84,252, 252, 84,252, 252, 88,
252, 252, 92,252, 252, 96,252, 252, 100,252, 252, 104,
252, 252, 108,252, 252, 112,252, 252, 116,252, 252, 120,
252, 252, 124,252, 252, 124,252, 252, 128,252, 252, 132,
252, 252, 136,252, 252, 140,252, 252, 144,252, 252, 148,
252, 252, 152,252, 252, 156,252, 252, 160,252, 252, 164,
252, 252, 168,252, 252, 168,252, 252, 172,252, 252, 176,
252, 252, 180,252, 252, 184,252, 252, 188,252, 252, 192,
252, 252, 196,252, 252, 200,252, 252, 204,252, 252, 208,
252, 252, 208,252, 252, 212,252, 252, 216,252, 252, 220,
252, 252, 224,252, 252, 228,252, 252, 232,252, 252, 236,
252, 252, 240,252, 252, 244,252, 252, 248,252, 252, 252};
//************************************************************************
//* SetVGAMode13 *
//* Sets the graphics screen to mode 13h (320x200) at 256 colors. *
//************************************************************************
void SetVGAMode13()
{
union REGS regs;
regs.x.ax = VGA_MODE;
int86(VIDEO_INT, ®s, ®s);
}
//************************************************************************
//* RestoreTextMode *
//* Sets the video mode back to text mode. *
//************************************************************************
void RestoreTextMode()
{
union REGS regs;
regs.x.ax = TEXT_MODE;
int86(VIDEO_INT, ®s, ®s);
}
//************************************************************************
//* SetPalette *
//* Sets the 256 color palette of the VGA to reflect the RGB colos *
//* contained in the pal array. Set the DAC_WRITE_INDEX to the color *
//* you want to start with, in our case 0 (the first color index). *
//* Then send the RGB values for each successive color index to the *
//* DAC_DATA_REGister.
//************************************************************************
void SetPalette()
{
int i;
outportb(DAC_WRITE_INDEX, 0);
for(i=0; i<PALETTE_SIZE; i++)
{
pal[i] = pal[i] >> 2;
outportb(DAC_DATA_REG, pal[i]);
}
}
//************************************************************************
//* Main *
//* Creates a fire (plasma) effect *
//************************************************************************
void main()
{
SetVGAMode13(); // Setup the graphics mode
SetPalette(); // Setup the color palette
randomize(); // Initialize the random number generator
ch=' '; // Initialize the input character
// Initialize the video buffer to 0's
for(i=0;i<BUF_HEIGHT;i++)
{
for(j=0;j<BUF_WIDTH;j++)
{
p1[i][j]=0;
}
}
// Loop until ESC is pressed
while(ch != ESC_KEY)
{
// Transform current buffer
for(i=1;i<BUF_HEIGHT;i++)
{
for(j=0;j<BUF_WIDTH;j++)
{
if(j==0) p1[i-1][j] = (p1[i][j]+
p1[i-1][79]+
p1[i][j+1]+
p1[i+1][j]) / 4;
else if(j==79) p1[i-1][j] = (p1[i][j]+
p1[i][j-1]+
p1[i+1][0]+
p1[i+1][j]) / 4;
else p1[i-1][j] = (p1[i][j]+
p1[i][j-1]+
p1[i][j+1]+
p1[i+1][j]) / 4;
//if(p1[i][j] > 0) p1[i][j]= p1[i][j] - 1;
//if(p1[i][j] > 0) p1[i][j]= p1[i][j] - 1;
//if(p1[i][j] > 0) p1[i][j]= p1[i][j] - 1;
if(p1[i][j] > 11) p1[i][j]= p1[i][j] - 12;
else if(p1[i][j] > 3) p1[i][j] = p1[i][j] - 4;
else {
if(p1[i][j] > 0) p1[i][j]--;
if(p1[i][j] > 0) p1[i][j]--;
if(p1[i][j] > 0) p1[i][j]--;
}
}
}
// Set new bottom line with random white or black
delta = 0;
for(j=0;j<BUF_WIDTH;j++)
{
if(random(10) < 5)
{
delta=random(2)*255;
}
p1[BUF_HEIGHT - 2][j] = delta;
p1[BUF_HEIGHT - 1][j] = delta;
}
// Write the buffer to the screen
screen = MK_FP(VGA_SCREEN,0);
for(i=0; i<V_HEIGHT; i++)
{
for(k=0; k<4; k++)
{
for(j=0; j<V_WIDTH; j++)
{
for(l=0; l<4; l++)
{
*screen = (unsigned char)p1[i][j];
screen++;
}
}
}
}
// Check for ESC key pressed
if(kbhit())
{
ch=getch();
}
}//End of While
RestoreTextMode();
}